共计 1366 个字符,预计需要花费 4 分钟才能阅读完成。
题目描述
一个工厂有m条流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。
现给定流水线个数m,需要完成的作业数n, 每个作业的处理时间分别为t1,t2…tn。请你编程计算处理完所有作业的耗时为多少?
当n>m时,首先处理时间短的m个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。
题目要求
- 输入描述:
第一行为2个整数(采用空格分隔),分别表示流水线个数m和作业数n;
第二行输入n个整数(采用空格分隔),表示每个作业的处理时长t1,t2…tn。
(0< m,n<100,0<t1,t2…tn<100)
注:保证输入都是合法的。 - 输出描述:
输出处理完所有作业的总时长
示例1
输入
3 5
8 4 3 2 10
输出
13
说明
- 先安排时间为2、3、4的3个作业。
- 第一条流水线先完成作业,然后调度剩余时间最短的作业8。
- 第二条流水线完成作业,然后调度剩余时间最短的作业10。
- 总工耗时就是第二条流水线完成作业的时间13(3+10)。
JAVA解法
import java.util.*;
import java.util.stream.Collectors;
/**
* @since 2022年4月19日
*/
public class AssembleLine {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String m_n = scanner.nextLine();
String timeStr = scanner.nextLine();
// 取出m条流水线 n个作业数
int m = Integer.parseInt(m_n.split(" ")[0]);
int n = Integer.parseInt(m_n.split(" ")[1]);
// 所有作业数的时间集合
List<Integer> ts = Arrays.stream(timeStr.split(" ")).map(Integer::parseInt).sorted(Comparator.comparingInt(o -> o)).collect(Collectors.toList());
// 由于他们可以同时开工
// 如果流水线多于任务数,那么就取时间最上的那个任务时间
if (n <= m) {
System.out.println(ts.get(n - 1));
}
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < m; i++) {
res.add(ts.get(i));
}
for (int i = m; i < ts.size(); i++) {
int index = i % m; // 换个方式
// Integer min = res.stream().sorted().iterator().next(); // 这一快很有意思,无限制取,和平常了解的迭代器不同
// int index = res.indexOf(min);
res.set(index, res.get(index) + ts.get(i));
}
Integer maxTime = res.stream().max(Integer::compareTo).get();
System.out.println(maxTime);
}
}
正文完